package chapter07._05_Logging;

import java.io.IOException;
import java.util.logging.*;

/**
 * @Author: insight
 * @Description:
 * @LastDate: 2020/11/8
 */
public class Test03_Processor {
    public static final Logger logger = Logger.getLogger("chapter07._05_Logging.Test03_Processor");

    /**
    * 默认情况下，日志记录器会把记录发送到自己的日志处理器
    * 和父处理器，而最终的祖先处理器名为""，有一个ConsoleHandler
    *
    * 处理器也有自己的日志级别
    * 要记录日志 需要把日志级别同时高于等于自己的日志记录器和处理器的级别
    *
    * 前面提过可以通过配置文件修改默认处理器级别
    * 不过也可以自己添加一个处理器
    * 例如 要记录FINER级别及以上的日志
    * logger.setLevel(Level.FINER);
    * logger.setUseParentHandlers(false);
    * 一个日志记录器会把记录发送到自己类的处理器 和 祖先处理器
    * 祖先日志记录器会把所有高于等于INFO的记录发送到控制台
    * 不禁用祖先日志记录器 控制台会看到双重记录
    * new ConsoleHandle().setLevel(Level.FINER);
    * logger.addHandler(handler);
    * */
    public static void setMyConsoleHandler() {
        logger.setUseParentHandlers(false);
        logger.setLevel(Level.FINER);
        var newConsoler = new ConsoleHandler();
        newConsoler.setLevel(Level.FINER);
        logger.addHandler(newConsoler);
    }

    /**
    * 日志处理器除了可以发送到控制台，也可以发送到其他地方
    * 方法是添加其他处理器
    * 比如很有用的FileHandler和SocketHandler 分别是发送到文件和主机
    * */
    public static void setFileHandler() throws IOException {
        var handler = new FileHandler("C:\\Users\\Learner\\Desktop\\Java_ws\\Exercise\\fundamentals\\chapter07\\_05_Logging\\Test03.lck");
        handler.setLevel(Level.INFO);
        logger.setUseParentHandlers(false);
        logger.addHandler(handler);
    }

    public static void setFileHandlerWithFullParams() throws IOException {
        /* 还可以通过配置文件或者构造器设置参数 修改处理器的默认行为
         * public FileHandler(String pattern, int limit, int count, boolean append)
         * @param pattern  the pattern for naming the output file
         * @param limit  the maximum number of bytes to write to any one file
         * limits: 0 means unlimited, default limit is 500
         * counts: 1 means non-loop
         * 有必要解释一下cnts
         * 没当超过limits 就会删除最老的文件 其他文件重命名
         * 重命名方式经测试 是在原序列号上加1
         * 然后生成一个序号为0的文件
         * 也就是说 每次当前写入的文件都是0号
         * @param count  the number of files to use
         * @param append  specifies append mode
         */
        var handler = new FileHandler("C:\\Users\\Learner\\Desktop\\Java_ws\\Exercise\\fundamentals\\chapter07\\_05_Logging\\Test03.log", 1024, 3, false);
        handler.setLevel(Level.INFO);
        logger.setUseParentHandlers(false);
        logger.addHandler(handler);
    }

    public static void setFileHandlerWithAppend() throws IOException {
        var handler = new FileHandler("C:\\Users\\Learner\\Desktop\\Java_ws\\Exercise\\fundamentals\\chapter07\\_05_Logging\\Test03.log",true);
        handler.setLevel(Level.INFO);
        logger.setUseParentHandlers(false);
        logger.addHandler(handler);
    }

    public static void main(String[] args) throws IOException {
        /*
        设置每个文件1kb 最多3个文件 写入11条
        结果 info1~3消失不见
        Test03_Processor.setFileHandlerWithFullParams();
        */
        //        Test03_Processor.setFileHandler();

        /*
        设置追加写入
        结果 只有一个文件
        */
        Test03_Processor.setFileHandlerWithAppend();
        var sf = "Write info msg %d to file";
        int loop = 11;
        for (int i = 0; i < loop; i++) {
            //每条info大概1/3kb
            logger.info(String.format(sf, i + 1));
        }
    }
}
